package net.sumcraft.mythicmobitemhandler.util;

import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.*;

public class $ {
    /**
     * @param itemStack 物品
     * @param player    被给予的玩家
     * @return 物品
     */
    public static ItemStack replacePlaceholder(ItemStack itemStack, Player player) {
        if (!ConfigManager.enable_PAPI_lore) {
            return itemStack;
        }
        ItemMeta itemMeta = itemStack.hasItemMeta() ? itemStack.getItemMeta() : Bukkit.getItemFactory().getItemMeta(itemStack.getType());
        if (itemMeta.hasDisplayName()) {
            itemMeta.setDisplayName(PlaceholderAPI.setPlaceholders(player, itemMeta.getDisplayName()));
        }
        if (itemMeta.hasLore()) {
            itemMeta.setLore(PlaceholderAPI.setPlaceholders(player, itemMeta.getLore()));
        }
        itemStack.setItemMeta(itemMeta);
        return itemStack;
    }

    /**
     * 替换Item的name和lore中的&->§
     *
     * @param itemStack 物品
     * @return 返回替换后的ItemStack
     */
    public static ItemStack replaceColreCode(ItemStack itemStack) {
        ItemMeta itemMeta = itemStack.hasItemMeta() ? itemStack.getItemMeta() : Bukkit.getItemFactory().getItemMeta(itemStack.getType());
        if (itemMeta.hasDisplayName()) {
            itemMeta.setDisplayName(itemMeta.getDisplayName().replace("&", "§"));
        }
        if (itemMeta.hasLore()) {
            List<String> loreList = itemMeta.getLore();
            itemMeta.setLore(replaceColorCode(loreList));
        }
        itemStack.setItemMeta(itemMeta);
        return itemStack;
    }

    /**
     * 将list 中的 &->§
     * @param loreList
     * @return
     */
    public static List<String> replaceColorCode(List<String> loreList) {
        for (int j = 0; j < loreList.size(); j++) {
            String lore = loreList.get(j);
            lore = lore.replace("&", "§");
            loreList.set(j, lore);
        }
        return loreList;
    }

    /**
     * @param itemStack 物品
     * @param level     传入的等级
     * @return 物品
     */
    public static ItemStack replaceLevel(ItemStack itemStack, int level) {
        if (!ConfigManager.enable_level_lore) {
            return itemStack;
        }
        ItemMeta itemMeta = itemStack.hasItemMeta() ? itemStack.getItemMeta() : Bukkit.getItemFactory().getItemMeta(itemStack.getType());
        String itemName = itemMeta.getDisplayName();
        if (itemName != null && (itemName.contains("$level$") || itemName.contains("%level%"))) {
            itemName = itemName.replace("$level$", String.valueOf(level));
            itemName = itemName.replace("%level%", String.valueOf(level));
            itemMeta.setDisplayName(itemName);
        }
        if (itemMeta.hasLore()) {
            List<String> loreList = itemMeta.getLore();
            for (int j = 0; j < loreList.size(); j++) {
                String lore = loreList.get(j);
                lore = lore.replace("$level$", String.valueOf(level));
                lore = lore.replace("%level%", String.valueOf(level));
                loreList.set(j, lore);

            }
            itemMeta.setLore(loreList);
        }
        itemStack.setItemMeta(itemMeta);
        return itemStack;
    }

    /**
     * 传入的物品的lore格式为[String1;String2;String3;String4]
     * 则从String1,String2,String3,String4,中顺序抽取1-最大字符串数条插入原有的lore;
     * 如果lore格式为[count:NUM||String1;String2;String3;String4]
     * NUM如果为-1则抽取随机条数,范围是1-总条数
     * NUM为正整数则抽取固定条数
     * 则从String1,String2,String3,String4,中抽取NUM条lore;
     *
     * @param itemStack 物品
     */
    public static void randomLore(ItemStack itemStack) {
        if (!ConfigManager.enable_random_lore) {
            return;
        }
        ItemMeta itemMeta = itemStack.hasItemMeta() ? itemStack.getItemMeta() : Bukkit.getItemFactory().getItemMeta(itemStack.getType());
        List<String> oldLore = itemMeta.getLore();
        if (oldLore == null) {
            return;
        }
        ListIterator<String> li = oldLore.listIterator();
        while (li.hasNext()) {
            String slore = li.next();
            if (slore.startsWith("[") && slore.endsWith("]")) {
                String subLore = slore.substring(1, slore.length() - 1);
                if (slore.contains("count:")) {
                    ArrayList<String> tlore = new ArrayList<>(Arrays.asList(subLore.split("\\|\\|")[1].split(ConfigManager.spilt_key)));
                    int count = Integer.parseInt(slore.split("\\|\\|")[0].split("count:")[1]);

                    if (count < 0) {
                        count = (int) (Math.random() * tlore.size() + 1);
                    }
                    List<String> randomLore = getRandomList(tlore, count);
                    li.remove();
                    for (String str : randomLore) {
                        li.add(str);
                    }
                } else {
                    ArrayList<String> randomLore = new ArrayList<>(Arrays.asList(subLore.split(ConfigManager.spilt_key)));
                    int maxLoreAmount = randomLore.size();
                    int index = weightRandom(maxLoreAmount);
                    li.remove();
                    for (String str : randomLore.subList(0, index)
                    ) {
                        li.add(str);
                    }
                }
            }
        }
        itemMeta.setLore(oldLore);
        itemStack.setItemMeta(itemMeta);
    }

    /**
     * [1,2,3,4] 权重为[4,3,2,1]
     *
     * @param max 传入的最大数值
     * @return 返回一个加权的随机值
     */
    public static int weightRandom(int max) {
        List<Integer> weightList = new ArrayList<>();
        for (int i = 0; i <= max; i++) {
            for (int j = 0; j < i; j++) {
                weightList.add(max - i + 1);
            }
        }
        int randomNum = (int) (Math.random() * weightList.size());
        return weightList.get(randomNum);

    }

    /**
     * 从list中随机抽取若干不重复元素
     *
     * @param paramList:被抽取list
     * @param count:抽取元素的个数
     * @return 由抽取元素组成的新list
     */
    public static List getRandomList(List paramList, int count) {
        if (paramList.size() < count) {
            return paramList;
        }
        Random random = new Random();
        List<Integer> tempList = new ArrayList<Integer>();
        List<Object> newList = new ArrayList<Object>();
        int temp = 0;
        for (int i = 0; i < count; i++) {
            //将产生的随机数作为被抽list的索引
            temp = random.nextInt(paramList.size());
            if (!tempList.contains(temp)) {
                tempList.add(temp);
                //newList.add(paramList.get(temp));
            } else {
                i--;
            }
        }
        Collections.sort(tempList);
        for (Integer i : tempList
        ) {
            newList.add(paramList.get(i));
        }
        return newList;
    }

    /**
     * 判断一个Sting 是不是为纯数字
     *
     * @param str
     * @return true-纯数字 false-null或不是纯数字
     */
    public static boolean canParseInt(String str) {
        //验证是否为空
        if (str == null) {
            return false;
        }
        //使用正则表达式判断该字符串是否为数字，第一个\是转义符，\d+表示匹配1个或 //多个连续数字，"+"和"*"类似，"*"表示0个或多个
        return str.matches("\\d+");
    }
}
